package com.spring.demo.jdkproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * @version 1.0.0
 * @Date: 2022/5/30 15:14
 * @Author ZhuYouBin
 * @Description
 */
/** 自定义代理逻辑 */
public class CustomInvocationHandler implements InvocationHandler {
    /** 维护目标对象, 因为我们不知道目标对象的类型,
     * 所以声明为Object, 具体类型程序运行过程中确定 */
    private Object target;

    public CustomInvocationHandler(Object target) {
        this.target = target;
    }

    /** 这个方法，才是真正实现代理的，对目标方法进行功能增强 */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // proxy: 代理对象
        // method: 目标对象的方法
        // args: 目标方法的参数
        System.out.println("Proxy: 找代理对象帮我去购买房子......");
        // 通过反射机制调用方法
        Object ret = method.invoke(target, args);
        System.out.println("Proxy: 代理对象帮我把房子购买好了......");
        // 返回方法参数
        return ret;
    }
}
